package day14;

import java.util.concurrent.TimeUnit;

/**
 * @author: 王丹
 * @create: 2021-07-06 14:22
 **/
public class Demo2 {
    static Object lock = new Object();

    /**
     * 运行结果分析：
     * 上面代码中将synchronized去掉了，发现调用wait()方法和调用notify()方法都抛出了
     * IllegalMonitorStateException异常，原因：Object类中的wait、notify、notifyAll用于线程等待
     * 和唤醒的方法，都必须在同步代码中运行（必须用到关键字synchronized）
     */
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            System.out.println(System.currentTimeMillis() + "," + Thread.currentThread().getName() + " start!");
            try {
                lock.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(System.currentTimeMillis() + "," + Thread.currentThread().getName() + " 被唤醒!");
        });
        t1.setName("t1");
        t1.start();
        TimeUnit.SECONDS.sleep(3L);
        //注意必须使用synchronized获取对象监视器，否则抛出java.lang.IllegalMonitorStateException异常
        //抛出该异常表明某一线程已经试图等待对象的监视器，或者试图通知其他正在等待对象的监视器，
        //然而本身没有指定的监视器的线程。
        lock.notify();
    }
}
